'''
Created on 2019年5月22日

@author: Administrator
在 python 中，类型属于对象，变量是没有类型的：
'''
#定义函数  传不可变对象的实例 String Tuple numbers
# 传可变对象时，函数里的值和外面的值都会改变
from _ast import Nonlocal
def changeInt(a):
    a = 10
    return a
b=2
changeInt(b)
print(b)
# 可写函数说明
def changeme( mylist ):
    #"修改传入的列表"
    mylist.append([1,2,3,4])
    print ("函数内取值: ", mylist)
    return
 
# 调用changeme函数
mylist = [10,20,30]
changeme( mylist )
print ("函数外取值: ", mylist)

'''
参数
'''
#必需参数
def printme(str2):
    print(str2)
    return 
printme("我是必传参数")
#关键词参数
def printme2(str2):
    print(str2)
    return 
printme2(str2 = "菜鸟教程")
#python调用参数的顺序与声明时可以不一致 ,函数可以设置默认值,有默认值的参数可以不传
def printme3(name ,age = 3):
    print("名字是"+name)
    print("年龄是"+str(age))
    return 
printme3(age = 6,name = "刘亦菲")

#不定长参数 后面的参数会以元组的形式接收 加一个*的时候
#加两个*的时候会以字典的方式接收，且传参的时候以关键字的形式传参
def variableprogram(arg1,**vartuple):
    print(arg1)
    print(vartuple)
    return 
variableprogram(11,a=21,b=1233)

#匿名函数 python使用lambda来创建匿名函数
mysum = lambda a ,b:a +b

print(mysum(1,2))

#return语句
def sum3(a,b): 
    return a+b
c= sum3(2, 3)
print(c)

'''
python中，程序的变量并不是在那个位置都可以访问的，
一共有四种
局部作用域 Local
闭包函数外的函数中  enclosing
全局作用域  Global
内置作用域（内置函数所在的模块的范围  ） built-in
以 L -> E -> G -> B的规则查找
'''
g_count = 0 #全局作用域
def outer():
    o_count = 1 #闭包函数外的函数中
    def inner():
        i_count = 2 #局部作用域
'''
Python 中只有模块（module）
类（class） 以及函数（def lambda）
才会引入新的作用域
'''
if True:
    msg = "信息"
print(msg)

'''
当内部作用域想修改外部作用域的变量时，就要用到global和nonlocal关键字
'''
num = 1
def fun():
    global num  #需要使用global关键字声明
    print(num)
    num = 123
    print(num)
fun()   
print(num)

#闭包
def outer2():
    num =10
    def inner():
        nonlocal num
        num = 20
        print(num) 
    inner()
    print(num)
outer2()

a = 100
def division():
    a = a -1
    return 
division()

 


